/**
 * Copyright © 2016-2025 The Thingsboard Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.terracloud.server.service.log;

import com.terracloud.server.common.data.log.TerminalLog;
import com.terracloud.server.common.data.id.DeviceId;
import com.terracloud.server.common.data.id.TenantId;
import com.terracloud.server.common.data.id.TerminalLogId;
import com.terracloud.server.common.data.log.LogLevel;
import com.terracloud.server.common.data.log.LogType;
import com.terracloud.server.common.data.log.TerminalStatistics;
import com.terracloud.server.common.data.page.TimePageLink;

/**
 * 终端日志服务接口
 */
public interface TerminalLogService {

    /**
     * 保存终端日志
     *
     * @param terminalLog 终端日志实体
     * @return 保存后的终端日志实体
     */
    TerminalLog saveTerminalLog(TerminalLog terminalLog);

    /**
     * 根据ID查找终端日志
     *
     * @param terminalLogId 终端日志ID
     * @return 终端日志实体
     */
    TerminalLog findTerminalLogById(TerminalLogId terminalLogId);

    /**
     * 删除终端日志
     *
     * @param terminalLogId 终端日志ID
     */
    void deleteTerminalLog(TerminalLogId terminalLogId);

    /**
     * 根据设备ID查找终端日志列表
     *
     * @param tenantId 租户ID
     * @param deviceId 设备ID
     * @param pageLink 分页参数
     * @return 终端日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<TerminalLog> findTerminalLogsByDeviceId(TenantId tenantId, DeviceId deviceId, TimePageLink pageLink);

    /**
     * 根据租户ID查找终端日志列表
     *
     * @param tenantId 租户ID
     * @param pageLink 分页参数
     * @return 终端日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<TerminalLog> findTerminalLogsByTenantId(TenantId tenantId, TimePageLink pageLink);

    /**
     * 根据租户ID和日志类型查找终端日志列表
     *
     * @param tenantId 租户ID
     * @param logType 日志类型
     * @param pageLink 分页参数
     * @return 终端日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<TerminalLog> findTerminalLogsByTenantIdAndType(TenantId tenantId, LogType logType, TimePageLink pageLink);

    /**
     * 根据租户ID和日志级别查找终端日志列表
     *
     * @param tenantId 租户ID
     * @param logLevel 日志级别
     * @param pageLink 分页参数
     * @return 终端日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<TerminalLog> findTerminalLogsByTenantIdAndLevel(TenantId tenantId, LogLevel logLevel, TimePageLink pageLink);

    /**
     * 根据租户ID、设备ID和日志类型查找终端日志列表
     *
     * @param tenantId 租户ID
     * @param deviceId 设备ID
     * @param logType 日志类型
     * @param pageLink 分页参数
     * @return 终端日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<TerminalLog> findTerminalLogsByTenantIdAndDeviceIdAndType(TenantId tenantId, DeviceId deviceId, LogType logType, TimePageLink pageLink);

    /**
     * 根据租户ID、设备ID和日志级别查找终端日志列表
     *
     * @param tenantId 租户ID
     * @param deviceId 设备ID
     * @param logLevel 日志级别
     * @param pageLink 分页参数
     * @return 终端日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<TerminalLog> findTerminalLogsByTenantIdAndDeviceIdAndLevel(TenantId tenantId, DeviceId deviceId, LogLevel logLevel, TimePageLink pageLink);

    /**
     * 获取今日告警总数
     *
     * @param tenantId 租户ID
     * @return 今日告警总数
     */
    long getTodayAlertCount(TenantId tenantId);

    /**
     * 获取未处理警告数
     *
     * @param tenantId 租户ID
     * @return 未处理警告数
     */
    long getUnprocessedWarningCount(TenantId tenantId);

    /**
     * 获取紧急告警数
     *
     * @param tenantId 租户ID
     * @return 紧急告警数
     */
    long getCriticalAlertCount(TenantId tenantId);

    /**
     * 获取SLA达标率
     *
     * @param tenantId 租户ID
     * @return SLA达标率
     */
    double getSlaComplianceRate(TenantId tenantId);

    /**
     * 获取终端异常数
     *
     * @param tenantId 租户ID
     * @return 终端异常数
     */
    long getTerminalExceptionCount(TenantId tenantId);

    /**
     * 获取持续24小时以上的终端异常数
     *
     * @param tenantId 租户ID
     * @return 持续24小时以上的终端异常数
     */
    long getLongTermExceptionCount(TenantId tenantId);

    /**
     * 获取终端日志综合统计信息
     *
     * @param tenantId 租户ID
     * @return 终端日志统计信息
     */
    TerminalStatistics getTerminalStatistics(TenantId tenantId);

}